package name.huliqing.qfaces.temp;
///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package name.huliqing.qfaces.temp;
//
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Map;
//import javax.faces.context.FacesContext;
//import javax.faces.context.ResponseWriter;
// 
///**
// *
// * @author huliqing
// */ 
//public class ResLoader2 {
////	private final static Logger logger = Logger.getLogger(ResLoader2.class.getName());
//	
//	private final static ResLoader2 ins = new ResLoader2();
//	private ResLoader2(){}
//	public final static ResLoader2 getInstance() {
//		return ins;
//	}
//	
//	// The container of the QFaces resource.
//	private String ID_RESOURCE_JS = "name.huliqing.qfaces.resource.js";
//	
//	// System Resource Loaded, identify if the system resource had loaded.
//	private boolean sysLoaded;
//	
//    /**
//     * 直接加载JavaScript资源文件，资源路径必须类似这样：<BR />
//     * name/huliqing/qfaces/resource/xxx.js, 这些JavaScript资源将
//     * 以积极的方式进行加载，即在调用这个方法的时候即立即加载这些资源。
//     * 当某些组件需要在渲染的同时执行JavaScript函数时，使用这个方法
//     * 会更有效。但是使用积极方式加载资源文件时会阻塞页面其它元素的加载。
//     * 所以，建议优先使用“延迟”加载方式.
//     * @see #addJavaScript(String) 参考延迟加载方式
//     * @param jsPath
//     * 		需要立即加载的JavaScript资源文件路径。
//     * @param jsInit
//     * 		需要执行的JavaScript init(初始化)函数，可为null
//     */
//    public final void loadJavaScriptDirect(String jsPath, String jsInit) throws IOException {
//    	ResourceObj obj = this.findResourceObj();
//    	// 加载资源文件
//    	responseJavaScript(jsPath);
//    	// 立即执行JavaScript初始化 
//    	responseJavaScriptInit(jsInit);
//    	// 记住该JavaScript已经加载
//    	
//    }
//    
//    /**
//     * 延迟加载JavaScript资源文件，资源路径必须类似这样：<BR />
//     * name/huliqing/qfaces/resource/xxx.js, 这些JavaScript资源将
//     * 会进行延迟加载，即在页面的最后才加载。这可以有效防止JavaScript资源
//     * 在加载过程中阻塞页面其它元素的装载。所以默认建议使用该方法.
//     * @see #loadJavaScriptDirect(String, String) 参考直接加载方式
//     * @param path
//     * 		指定资源路径，若为null,则将只加载QFaces必要的资源如:QFaces-Utils.js, QFaces-Faces.js
//     * @throws IOException
//     */
//	public final void addJavaScript(String path) throws IOException {
//		Map<String, Object> rMap = QFaces.getFacesContext().getExternalContext().getRequestMap();
//		ResourceObj resObj = (ResourceObj) rMap.get(this.ID_RESOURCE_JS);
//		if (resObj == null) {
//			// 替换ResponseWriter(装饰...)
//			FacesContext fc = QFaces.getFacesContext();
//			ResponseWriter rw = fc.getResponseWriter();
//			MyResponseWriter mrw = new MyResponseWriter(rw);
//			fc.setResponseWriter(mrw);
//			
//			// CSS文件需要比较及时装载
//			this.responseCSS("name/huliqing/qfaces/resource/style.css");
//			
//			// 生成js容器 
//			resObj = new ResourceObj();
//			resObj.addJavaScript("name/huliqing/qfaces/resource/QFaces-Utils.js");
//			resObj.addJavaScript("name/huliqing/qfaces/resource/QFaces-Faces.js");
//			
//			// jsInit容器
//			String contextPath = fc.getExternalContext().getRequestContextPath();
//			StringBuilder sb = new StringBuilder()
//			.append("QFaces.Faces.contextPath = \"" + contextPath + "\";")
//			.append("QFaces.Faces.viewId = \"" + fc.getViewRoot().getViewId() + "\";")
//			.append("QFaces.Faces.suffix = \"" + Constant.SUFFIX + "\";")
//			.append("QFaces.Faces.filterName = \"" + Constant.FILTER_NAME + "\";")
//			.append("QFaces.Faces.loadingSrc = \"" + makeImageSrc(Constant.QFACES_LOADING) + "\";");
//			resObj.addInit(sb.toString());
//			
//			rMap.put(this.ID_RESOURCE_JS, resObj);
//		}
//		resObj.addJavaScript(path);
//	}
//	
//	public final void addJSInit(String fun) throws IOException {
//		FacesContext fc = QFaces.getFacesContext();
//		ResourceObj resObj = (ResourceObj) fc.getExternalContext().getRequestMap().get(this.ID_RESOURCE_JS);
//		// 确保正确载入ResourceObj
//		if (resObj == null) {
//			addJavaScript(null);
//			resObj = (ResourceObj) fc.getExternalContext().getRequestMap().get(this.ID_RESOURCE_JS);
//		}
//		resObj.addInit(fun);
//	}
//	
//	/**
//     * 输出图片资源
//     * @param path 图片路径,可能像这样: name/huliqing/qfaces/resource/QFaces.png
//     * @throws java.io.IOException
//     */
//    public final void loadImage(String path) throws IOException {
//    	FacesContext fc = QFaces.getFacesContext();
//    	String contextPath = fc.getExternalContext().getRequestContextPath();
//    	ResponseWriter w = fc.getResponseWriter();
//    	w.startElement("img", null);
//    	w.writeAttribute("style", "border:0;margin:0;padding:0;", null);
//    	w.writeAttribute("src", contextPath + Constant.PREFIX_RES_IMAGE + path + "." + Constant.SUFFIX, null);
//    	w.endElement("img");
//    }
//    
//    /**
//     * 将资源包里的图片路径转化为qfaces可以识别的路径
//     * @param path
//     * @return full src
//     */
//    public final String makeImageSrc(String path) {
//    	String contextPath = QFaces.getFacesContext().getExternalContext().getRequestContextPath();
//    	return (contextPath + Constant.PREFIX_RES_IMAGE + path + "." + Constant.SUFFIX);
//    }
//    
//    /**
//     * 装载系统资源: css, js, jsInit...all system required.
//     * @throws IOException
//     */
//    public final void responseAllSystemResource() throws IOException {
//    	ResourceObj resObj = this.findResourceObj();
//    	ArrayList<String> css = resObj.getSystemCss();
//    	ArrayList<String> js = resObj.getSystemJavaScript();
//    	ArrayList<String> jsInit = resObj.getSystemJavaScriptInit();
//    	for (String c : css)
//    		responseCSS(c);
//    	for (String j : js)
//    		this.responseJavaScript(j);
//    	for (String ji : jsInit)
//    		this.responseJavaScriptInit(ji);
//    	this.sysLoaded = true;
//    }
//	
//    /**
//     * 装载所有延迟加载的JavaScript资源
//     * @throws IOException
//     */
//    public final void responseAllJavaScriptLazy() throws IOException {
//    	ResourceObj resObj = this.findResourceObj();
//		ArrayList<String> jss = resObj.getJavaScripts();
//		ArrayList<String> inits = resObj.getInits();
//		for (String js : jss)
//			responseJavaScript(js);
//		for (String init : inits)
//			responseJavaScriptInit(init);
//    }
//    
//    // ---------- Protected
//    
//    private final void responseCSS(String path) throws IOException {
//        FacesContext fc = QFaces.getFacesContext();
//        String contextPath = fc.getExternalContext().getRequestContextPath();
//        ResponseWriter w = fc.getResponseWriter();
//        w.startElement("link", null);
//        w.writeAttribute("type", "text/css", null);
//        w.writeAttribute("rel", "stylesheet", null);
//        w.writeAttribute("href", contextPath + Constant.PREFIX_RES_CSS + path + "." + Constant.SUFFIX, null);
//        w.endElement("link");
//    }
//    
//    /**
//     * Waring: Don't use this method directly!!!
//     * @param path
//     * @throws IOException
//     */
//    private final void responseJavaScript(String path) throws IOException {
//    	FacesContext fc = QFaces.getFacesContext();
//        String contextPath = fc.getExternalContext().getRequestContextPath();
//        ResponseWriter w = fc.getResponseWriter();
//        w.startElement("script", null);
//        w.writeAttribute("type", "text/javascript", null);
//        w.writeAttribute("src", contextPath + Constant.PREFIX_RES_JAVASCRIPT + path + "." + Constant.SUFFIX, null);
//        w.endElement("script");
//    }
//    
//    /**
//     * Warning: Don't use this method directly!!!
//     * @param fun
//     * @throws IOException
//     */
//    private final void responseJavaScriptInit(String fun) throws IOException {
//        ResponseWriter w = QFaces.getFacesContext().getResponseWriter();
//        w.startElement("script", null);
//        w.writeAttribute("type", "text/javascript", null);
//        w.writeText(fun, null);
//        w.endElement("script");
//    }
//    
//    // 查找资源容器
//    private final ResourceObj findResourceObj() throws IOException {
//    	Map<String, Object> rMap = QFaces.getFacesContext().getExternalContext().getRequestMap();
//		ResourceObj resObj = (ResourceObj) rMap.get(this.ID_RESOURCE_JS);
//		if (resObj == null) {
//			FacesContext fc = QFaces.getFacesContext();
//			resObj = new ResourceObj();			
//			resObj.addSystemCss("name/huliqing/qfaces/resource/style.css");
//			resObj.addSystemJavaScript("name/huliqing/qfaces/resource/QFaces-Utils.js");
//			resObj.addSystemJavaScript("name/huliqing/qfaces/resource/QFaces-Faces.js");
//			
//			String contextPath = fc.getExternalContext().getRequestContextPath();
//			StringBuilder sb = new StringBuilder()
//			.append("QFaces.Faces.contextPath = \"" + contextPath + "\";")
//			.append("QFaces.Faces.viewId = \"" + fc.getViewRoot().getViewId() + "\";")
//			.append("QFaces.Faces.suffix = \"" + Constant.SUFFIX + "\";")
//			.append("QFaces.Faces.filterName = \"" + Constant.FILTER_NAME + "\";")
//			.append("QFaces.Faces.loadingSrc = \"" + makeImageSrc(Constant.QFACES_LOADING) + "\";");
//			resObj.addSystemJavaScriptInit(sb.toString());
//			
//			// Replace ResponseWriter with MyResponseWriter
//			ResponseWriter rw = fc.getResponseWriter();
//			MyResponseWriter mrw = new MyResponseWriter(rw);
//			fc.setResponseWriter(mrw);			
//			rMap.put(this.ID_RESOURCE_JS, resObj);
//		}
//		return resObj;
//    }
//}
